package com.xiaobaibai.units;

import com.alibaba.fastjson.JSON;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.xiaobaibai.common.TokenCommon;
import com.xiaobaibai.pojo.UserAdmin;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;

import java.util.*;

@Slf4j
public class TokenUnit {

    //todo  更好的安全性时,token加密的盐是实时生成的,不是写死的,生成后将盐放入redis缓存,验证时再拿出来
    //todo  并且对于数据库的密码的盐,也不是写死的,如果黑客得到了数据库,那么它破解了一个密码,那黑客将知道库中所有此密码的用户,所以应该根据用户id动态的对用户密码加盐

    public static String getToken(UserAdmin userAdmin){
        Date date = new Date();
        String token = JWT.create()
                //下面这
                .withAudience(userAdmin.getUserId())//发给谁的签名
                .withClaim(TokenCommon.TOKEN_ROLE,"ROLE_"+userAdmin.getUserRole())
//                .withClaim("还可以自定义key","还可以自定义value")
//                .withIssuer("xiaobaibai")//谁发放的签名
//                .withSubject("subject")//签名的主题
//                .withNotBefore(date)//签名的生效时间
                .withIssuedAt(date)//签名的生成时间
                .withExpiresAt(DateUtils.addHours(date, 2))//签名失效时间
//                .withJWTId(UUID.randomUUID().toString())//jwt的编号,相当于一个jwt的id
                .sign(Algorithm.HMAC256(TokenCommon.TOKEN_ASSERT));//到时解密用的密匙(只能服务器知道)
        return token;
    }

    public static Map checkingToken(String token){

        Map map=new HashMap<>();

        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(TokenCommon.TOKEN_ASSERT)).build();

        try {
            DecodedJWT verify = jwtVerifier.verify(token);
            map.put(TokenCommon.TOKEN_RESULT,true);
            map.put(TokenCommon.TOKEN_ROLE,verify.getClaim(TokenCommon.TOKEN_ROLE).asString());
            map.put(TokenCommon.TOKEN_USER_ID,verify.getAudience());
        }catch (Exception e){
            map.put(TokenCommon.TOKEN_RESULT,false);
            log.info("token错误");
        }

        return map;
    }

}
